// 对axios进行封装
import axios from "axios";
import NProgress from "nprogress";
import "nprogress/nprogress.css";

NProgress.configure({ showSpinner: false });

const errorMessages = {
  401: "没有权限访问",
  403: "禁止访问",
  404: "资源找不到",
  500: "服务器故障",
};

const request = axios.create({
  // 增加请求地址的前缀
  baseURL: "/api",
  // 请求头
  headers: {},
  // 请求超时，如果10m还没回来就会中断请求
  timeout: 10000,
});

// 设置拦截器
// 就是中间件

// 请求拦截器，里面有两个方法，请求成功方法，请求失败方法
request.interceptors.request.use(
  // 成功的回调
  (config) => {
    // config里面是配置对象，包含 method、url、body。。。
    // 可以对config进行一些设置，如：config.headers.token="xxx"

    // 进度条开始
    NProgress.start();

    // return被重新修改过的config会作为发送请求的对象，去发送请求
    return config;
  }
  // },
  // // 失败的回调，一般不触发
  // ()=>{}
  // );
);
// 响应拦截器 也有两个函数
request.interceptors.response.use(
  // 成功的回调
  (response) => {
    // 进度条执行完成
    NProgress.done();

    // 判断功能是否成功
    if (response.data.code == 200) {
      // 返回数据
      return response.data.data;
    } else {
      // 功能失败
      const message = response.data.message || "未知错误";
      return Promise.reject(message);
    }
  },
  // 失败的回调 会直接告诉失败的原因
  (error) => {
    // 进度条执行完成
    NProgress.done();

    let message = "未知错误，请求管理员";

    if (error.response) {
      message = errorMessages[error.response.status];
    } else {
      // repsonse没有值，说明响应没有回来，断网 Network Error 网速太慢 timeout
      if (error.message.indexOf("Network Error") > -1) {
        message = "网络断开链接，请打开网络链接试试";
      } else if (error.message.indexOf("timeout") > -1) {
        message = "网速太慢了，打开4G网或连接WIFI试试";
      }
    }

    return Promise.reject(message);
  }
);

// 暴露出去
export default request;
